﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using AccesoData.Interfaces;
using Entidades;
using MySql.Data.MySqlClient;

namespace AccesoData.DAOMySql
{
    public class DaoInspeccionMySql:ConexionBaseDatos,IDAOInspeccion
    {
        /// <summary>
        /// Agrega los datos de la inspeccion del siniestro en base de datos
        /// </summary>
        /// <param name="inspeccion"></param>
        /// <param name="siniestro"></param>
        /// <returns></returns>
        public int AgregarInspeccion(Inspeccion inspeccion, Entidad siniestro)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "AgregarInspeccion";

                comando.Parameters.AddWithValue("@idPersonal", inspeccion.Ajustador.Id);
                comando.Parameters.AddWithValue("@idSiniestro", siniestro.Id);
                comando.Parameters.AddWithValue("@fechaInspeccion", inspeccion.FechaInspeccion);
                comando.Parameters.AddWithValue("@fechaAsignacion", inspeccion.FechaAsignacion);
                comando.Parameters.AddWithValue("@fechaEntregaPre",
                    (inspeccion.FechaEntregaInformePreliminar.Ticks == 0) ? (object) null: 
                    inspeccion.FechaEntregaInformePreliminar);
                comando.Parameters.AddWithValue("@fechaEntregaFin",
                    (inspeccion.FechaRecibidoInformePreliminar.Ticks == 0) ? (object) null: 
                    inspeccion.FechaEntregaInformePreliminar);
                comando.Parameters.AddWithValue("@fechaReciboPre",
                    (inspeccion.FechaEntregaInformeFinal.Ticks == 0) ? (object) null: 
                    inspeccion.FechaEntregaInformePreliminar);
                comando.Parameters.AddWithValue("@fechaReciboFin",
                    (inspeccion.FechaRecibidoInformeFinal.Ticks == 0) ? (object) null: 
                    inspeccion.FechaEntregaInformePreliminar);

                comando.Parameters["@idPersonal"].Direction = ParameterDirection.Input;
                comando.Parameters["@idSiniestro"].Direction = ParameterDirection.Input;
                comando.Parameters["@fechaInspeccion"].Direction = ParameterDirection.Input;
                comando.Parameters["@fechaAsignacion"].Direction = ParameterDirection.Input;
                comando.Parameters["@fechaEntregaPre"].Direction = ParameterDirection.Input;
                comando.Parameters["@fechaEntregaFin"].Direction = ParameterDirection.Input;
                comando.Parameters["@fechaReciboPre"].Direction = ParameterDirection.Input;
                comando.Parameters["@fechaReciboFin"].Direction = ParameterDirection.Input;
                int id = 0;
                MySqlDataReader reader = comando.ExecuteReader();
                while (reader.Read())
                {
                    id = (reader[0] == DBNull.Value) ? 0 : (int)reader[0];
                }

                CerrarConexion();
                return id;
            }
            catch (Exception)
            {

                return -1;
            }
        }

        /// <summary>
        /// edita los datos de una inspeccion ya almacenado
        /// </summary>
        /// <param name="inspeccion"></param>
        /// <returns></returns>
        public bool EditarInspeccion(Inspeccion inspeccion)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "EditarInspeccion";

                comando.Parameters.AddWithValue("@idPersonal", inspeccion.Ajustador.Id);
                comando.Parameters.AddWithValue("@fechaInspeccion", inspeccion.FechaInspeccion);
                comando.Parameters.AddWithValue("@fechaAsignacion", inspeccion.FechaAsignacion);
                comando.Parameters.AddWithValue("@fechaEntregaPre", inspeccion.FechaEntregaInformePreliminar);
                comando.Parameters.AddWithValue("@fechaEntregaFin", inspeccion.FechaRecibidoInformePreliminar);
                comando.Parameters.AddWithValue("@fechaReciboPre", inspeccion.FechaEntregaInformeFinal);
                comando.Parameters.AddWithValue("@fechaReciboFin", inspeccion.FechaRecibidoInformeFinal);
                comando.Parameters.AddWithValue("@idInspeccion", inspeccion.Id);

                comando.Parameters["@idPersonal"].Direction = ParameterDirection.Input;
                comando.Parameters["@fechaInspeccion"].Direction = ParameterDirection.Input;
                comando.Parameters["@fechaAsignacion"].Direction = ParameterDirection.Input;
                comando.Parameters["@fechaEntregaPre"].Direction = ParameterDirection.Input;
                comando.Parameters["@fechaEntregaFin"].Direction = ParameterDirection.Input;
                comando.Parameters["@fechaReciboPre"].Direction = ParameterDirection.Input;
                comando.Parameters["@fechaReciboFin"].Direction = ParameterDirection.Input;
                comando.Parameters["@idInspeccion"].Direction = ParameterDirection.Input;
                comando.ExecuteNonQuery();

                CerrarConexion();
                return true;
            }
            catch (Exception)
            {

                return false;
            }
        }

        /// <summary>
        /// eliminar una inspeccion de la base de datos
        /// </summary>
        /// <param name="inspeccion"></param>
        /// <returns></returns>
        public bool EliminarInspeccion(Inspeccion inspeccion)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "EliminarInspeccion";

                comando.Parameters.AddWithValue("@idInspeccion", inspeccion.Id);

                comando.Parameters["@id"].Direction = ParameterDirection.Output;
                comando.ExecuteNonQuery();

                CerrarConexion();
                return true;
            }
            catch (Exception)
            {

                return false;
            }
        }

        /// <summary>
        /// obtiene los datos de la inspeccion de un siniestro dado el numero 
        /// identificador de este
        /// </summary>
        /// <param name="siniestro"></param>
        /// <returns></returns>
        public Inspeccion ObtenerInspeccionSiniestro(Entidad siniestro)
        {
            try
            {
                MySqlCommand comando = new MySqlCommand();
                Inspeccion inspeccion = FabricaEntidades.ObtenerInspeccion();  

                comando.Connection = Conexion();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "ObtenerInspeccionSiniestro";

                comando.Parameters.AddWithValue("@idSiniestro", siniestro.Id);
                comando.Parameters["@idSiniestro"].Direction = ParameterDirection.Input;
                MySqlDataReader reader = comando.ExecuteReader();

                while (reader.Read())
                { 

                    inspeccion.Id = (int)reader[0];
                    inspeccion.Ajustador.Id = (int) reader[1];
                    inspeccion.FechaInspeccion = (DateTime) reader[3];
                    inspeccion.FechaAsignacion = (DateTime) reader[4];
                    inspeccion.FechaEntregaInformePreliminar = 
                        (reader[5] == DBNull.Value)?new DateTime() : (DateTime) reader[5];
                    inspeccion.FechaRecibidoInformePreliminar =
                        (reader[6] == DBNull.Value) ? new DateTime() : (DateTime)reader[6];
                    inspeccion.FechaEntregaInformeFinal =
                        (reader[7] == DBNull.Value) ? new DateTime() : (DateTime)reader[7];
                    inspeccion.FechaRecibidoInformeFinal =
                        (reader[8] == DBNull.Value) ? new DateTime() : (DateTime)reader[8];

                }

                reader.Close();
                CerrarConexion();
                return inspeccion;
            }
            catch (Exception)
            {

                return null;
            }
        }
    }
}
